package util;


import org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

/**
 * 数据库连接的工具类
 */
public class BaseDao {

    public static DataSource ds;
    Connection conn=null;

    /**
     * 当类被加载时执行
     */
    static{
        try {
            Properties pro=new Properties();
            InputStream in= BaseDao.class.getResourceAsStream("/jdbc.properties");
            pro.load(in);
            ds= BasicDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * @return  conn 连接
     */
    public Connection getConnection(){
        try {
            if(conn==null){
            conn=ds.getConnection();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }


    /**
     * 释放相关连接
     */
    public void ConnectionClose(Connection conn, Statement st, ResultSet rs){
        try {
            if(rs!=null){
                rs.close();
            }
            if(st!=null){
                st.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 增删改的辅助方法
     * @param sql sql语句
     * @param param Object...param 接收全部参数并变换为数组
     * @return
     */
    public int crud(String sql,Object...param){
        //创建连接
        int bo=0;//返回的影响行数
        Connection conn=null;
        PreparedStatement ps=null;
        try {
            conn=getConnection();
            ps=conn.prepareStatement(sql);
            //观察有没有占位符号进行赋值
            if(param.length!=0){
                //如果不为0,表明当前sql语句中有占位符号
                for(int i=0;i<param.length;i++){
                    ps.setObject(i+1,param[i]);
                }
            }
            //执行sql语句
            bo=ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            ConnectionClose(conn,ps,null);
        }
        return bo;
    }
}
